<?php

namespace fastphp\facade;

use fastphp\util\File;

final class Request
{
    private static $instance = null;

    private function __construct()
    {

    }

    // 私有克隆方法，防止外部克隆
    private function __clone()
    {
    }

    // 私有反序列化方法，防止外部反序列化
    private function __wakeup()
    {

    }

    public static function getInstance(): Request
    {
        if (empty(self::$instance)) {
            self::$instance = new self();
        }
        return self::$instance;
    }


    public static function isGet(): bool
    {
        return $_SERVER['REQUEST_METHOD'] == 'GET';
    }

    public static function isPost(): bool
    {
        return $_SERVER['REQUEST_METHOD'] == 'POST';
    }

    public static function isDelete(): bool
    {
        return $_SERVER['REQUEST_METHOD'] == 'DELETE';
    }

    public static function isPUT(): bool
    {
        return $_SERVER['REQUEST_METHOD'] == 'PUT';
    }

    public static function get($name = null)
    {
        return $name ? $_GET[$name] ?? null : $_GET;
    }

    public static function post($name = null)
    {
        // 获取请求的原始输入数据
        $json = file_get_contents('php://input');

        // 检查输入是否为有效的JSON字符串
        $data = json_decode($json, true); // 将JSON字符串解析为关联数组
        if (json_last_error() === JSON_ERROR_NONE) {
            // 处理解析后的数据
            return $data;
        }
        if (!empty($data)) {
            return $name ? $data[$name] ?? null : $data;
        }
        return $name ? $_POST[$name] ?? null : $_POST;
    }

    public static function put($name = null)
    {
        // 获取请求的原始输入数据
        $json = file_get_contents('php://input');

        // 检查输入是否为有效的JSON字符串
        $data = json_decode($json, true); // 将JSON字符串解析为关联数组
        if (json_last_error() === JSON_ERROR_NONE) {
            // 处理解析后的数据
            return $data;
        }
        return null;
    }

    public static function delete($name = null)
    {
        // 获取请求的原始输入数据
        $json = file_get_contents('php://input');

        // 检查输入是否为有效的JSON字符串
        $data = json_decode($json, true); // 将JSON字符串解析为关联数组
        if (json_last_error() === JSON_ERROR_NONE) {
            // 处理解析后的数据
            return $data;
        }
        return null;
    }

    public static function file($name = null)
    {
        return new File($_FILES[$name]);
    }

    public static function param($name = null)
    {
        // 检查请求方法，虽然这里主要是处理POST和PUT，但你可以根据需要添加其他方法
        if (self::isPost() || self::isPUT() || self::isDelete()) {
            // 获取请求的原始输入数据
            $json = file_get_contents('php://input');

            // 检查输入是否为有效的JSON字符串
            $data = json_decode($json, true); // 将JSON字符串解析为关联数组
            if (json_last_error() === JSON_ERROR_NONE) {
                // 处理解析后的数据
                return $name ? $data[$name] ?? null : $data;
            }
        }
        return $name ? $_REQUEST[$name] ?? null : $_REQUEST;
    }

    public static function header($name = null)
    {
        if (!function_exists('getallheaders')) {

            function getallheaders()

            {

                $headers = [];

                foreach ($_SERVER as $name => $value) {

                    if (substr($name, 0, 5) == 'HTTP_') {

                        $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;

                    }

                }

                return $headers;

            }

            return $name ? getallheaders()[$name] ?? null : getallheaders();
        } else {
            return $name ? \getallheaders()[$name] ?? null : \getallheaders();
        }

    }

}